#include "mainwidget.h"
#include "ui_mainwidget.h"
#include <QDebug>
#include <QPainter>
#include <QPen>
#include <QDateTime>
#include <QImage>
#include <QMessageBox>

MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainWidget)
{
    ui->setupUi(this);
}

MainWidget::~MainWidget()
{
    delete ui;
}

void MainWidget::mouseMoveEvent(QMouseEvent *event) {
    qDebug() << "mouseMoveEvent()";     // 记录笔迹的中间点
    newLine.append(event->pos());       // 鼠标移动划过的痕迹上的点添加到这条线中（会调用多次）
    update();   // 查阅QPaintEvent，当调用update时，才会执行绘画事件
}

void MainWidget::mousePressEvent(QMouseEvent *event) {
    qDebug() << "mousePressEvent()";    // 记录笔迹的起始点
    newLine.append(event->pos());       // 鼠标当前位置追加到newLine中
    update();   // 查阅QPaintEvent，当调用update时，才会执行绘画事件
}


void MainWidget::mouseReleaseEvent(QMouseEvent *event){
    qDebug() << "mouseReleaseEvent()";  // 记录笔迹的结束点
    lines.append(newLine);              // 新曲线追加到签名笔迹中
    update();

    // 清空newLine，保证它记录的是最新的笔画
    if(!newLine.empty()){
        newLine.clear();
    }
}

void MainWidget::paintEvent(QPaintEvent *event){
    // 创建一个缓存图像，如果没有则创建
    if (cachedImage.isNull()) {
        cachedImage = QPixmap(size());  // 以当前控件的大小构造QPixmap对象
        cachedImage.fill(QColor(240, 240, 240));    // 背景填充色
    }

    // 画在什么上面，用什么工具绘图，谁来绘图
    QPainter painter(&cachedImage);     // 构造画家：画在当前的widget窗口上面
    painter.setRenderHint(QPainter::Antialiasing, true);            // 启用抗锯齿，使绘制结果更加平滑
    painter.setRenderHint(QPainter::HighQualityAntialiasing, true); // 使用更高质量的抗锯齿
    painter.setRenderHint(QPainter::SmoothPixmapTransform, true);   // 使用渲染提示改善绘制位图时的平滑度
    QPen pen(Qt::black);                // 构造画笔：颜色黑色
    pen.setWidth(5);                    // 设置画笔粗细
    painter.setPen(pen);                // 画家拿着画笔

    // 绘制正在绘制中的线段
    if (!newLine.isEmpty() && newLine.size() > 1) {
        painter.drawPolyline(newLine.data(), newLine.size());
    }

    // 在缓存图像上绘制
    QPainter widgetPainter(this);

    widgetPainter.drawPixmap(0, 0, cachedImage);
}

void MainWidget::mouseDoubleClickEvent(QMouseEvent *event){
    if (event->button() == Qt::RightButton && event->modifiers() == Qt::NoModifier) {
        // 清除之前先保存
        saveSign();
        lines.clear();  // 清空签名数据
        cachedImage.fill(QColor(240, 240, 240));    //  修复实现增量绘制后，双击右键无法清除签名的问题
        update();       // 签名数据发生变化，调用update更新绘制
    }
    else if (event->button() == Qt::LeftButton && event->modifiers() == Qt::NoModifier) {
        // 保存当前签名，但不清除当前笔迹
        saveSign();
    }
}

void MainWidget::saveSign(){
    // 把当前整个窗口抓取下来，保存为png图片，并以时间戳命名
    QPixmap pixmap = this->grab();
    QImage image = pixmap.toImage();
    QDateTime currentDateTime = QDateTime::currentDateTime();
    QString timestamp = currentDateTime.toString("yyyy-MM-dd_hh-mm-ss");
    QString fileName = QString("sign_%1.png").arg(timestamp);
    bool saved = image.save(fileName, "PNG");

    // 保存结果弹窗提示
    if(saved){
        // 静态方法可直接成员可直接通过类名引用，而无需将类实例化
        QMessageBox::information(this, QString("签名已保存"), QString("文件名称：%1").arg(fileName));
    }
    else if(!saved){
        QMessageBox::information(this, QString("签名保存失败！"), QString("文件名称：%1").arg(fileName));
    }
}
